home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-19 / rcdsplay.zip / ADCFUNCS.PAS < prev    next >
Pascal/Delphi Source File  |  1991-03-23  |  4KB  |  100 lines

  1. {**********************************************************************
  2.  Unit   : ADCFUNCS
  3.  Version: 1.0
  4.  Purpose: This unit contains procedures for accessing the Stanford
  5.           Reasearch Systems, SR245 analog to digital NIM board over the
  6.           GPIB interface.
  7.  Author : Roger Carlson (Feb. 1991)
  8.  Notes  : 1. A boolean error flag is returned by most of these procedures.
  9.              Not that if the flag is already set, these procedures will
  10.              not alter that flag.
  11.  Changes:
  12. ***********************************************************************}
  13. UNIT ADCFUNCS;
  14.  
  15. INTERFACE
  16.  
  17. PROCEDURE ADCINIT(VAR ADUD:INTEGER; VAR ERR:BOOLEAN);
  18.   {Initializes the A/D board.  Returns the the unit descriptor in ADUD.}
  19. PROCEDURE ADCRESET(ADUD:INTEGER; VAR ERR:BOOLEAN);
  20.   {Perform master reset.}
  21. PROCEDURE ADCSYNC(ADUD:INTEGER; VAR ERR:BOOLEAN);
  22.   {Sets A/D to synchronous trigger mode.}
  23. FUNCTION ADOVERFLOW(ADUD:INTEGER; VAR ABORT:BOOLEAN):BOOLEAN;
  24.   {Returns true if missed data or voltage out of range.  ABORT is
  25.    set true if any other a/d board error is detected.}
  26. FUNCTION ADCREAD(ADUD,CH:INTEGER; VAR ERR,OVERFLOW:BOOLEAN):REAL;
  27.   {Reads channel CH of SR245 A/D board.  ERR should be initialized
  28.    externally.  OVERFLOW flags out of range or missed data.}
  29.  
  30. IMPLEMENTATION
  31.  
  32. USES TPDECL,       {National Instruments GPIB interface}
  33.      GPIBFUNC,     {version 1.0}
  34.      GRAPH,        {screen graphics driver}
  35.      IOFUNCS;      {version 1.4}
  36.  
  37. {*********** ADCINIT(VAR ADUD:INTEGER; VAR ERR:BOOLEAN) *******************}
  38. PROCEDURE ADCINIT;
  39.   {Initializes the A/D board.  Returns the the unit descriptor in ADUD.}
  40. VAR ADNAME:NBUF; {7 character string GPIB name for A/D converter}
  41. BEGIN
  42.   ADNAME:='AD     '; ADUD:=IBFIND(ADNAME); {open A/D over GPIB}
  43.   IF ADUD<0 THEN BEGIN
  44.     RESTORECRTMODE; BEEP(200); ERR:=TRUE;
  45.     WRITELN('GPIB interface to A/D ibfind error!');
  46.     WRITE('Hit <ENTER> to continue. '); READLN;
  47.     END {IF ADUD<0}
  48.   ELSE BEGIN {clear the GPIB device}
  49.     IBCLR(ADUD);
  50.     ERR:=ERR OR GPIBERR('Procedure ADCINIT');
  51.     END;
  52. END; {ADCINIT}
  53.  
  54. {*************** ADCRESET(ADUD:INTEGER; VAR ERR:BOOLEAN) *******************}
  55. PROCEDURE ADCRESET;  {Perform master reset.}
  56. VAR  WRT:ARRAY[1..4] OF CHAR;
  57. BEGIN
  58.   WRT[1]:='M'; WRT[2]:='R'; WRT[3]:=CHR($0D); WRT[4]:=CHR($0A);
  59.   IBWRT(ADUD,WRT,4); ERR:=ERR OR GPIBERR('Procedure ADCRESET');
  60. END; {PROCEDURE ADCRESET}
  61.  
  62. {************** ADCSYNC(ADUD:INTEGER; VAR ERR:BOOLEAN) *********************}
  63. PROCEDURE ADCSYNC;  {Sets A/D to synchronous trigger mode.}
  64. VAR WRT:ARRAY[1..4] OF CHAR;
  65. BEGIN
  66.   WRT[1]:='M'; WRT[2]:='S'; WRT[3]:=CHR($0D); WRT[4]:=CHR($0A);
  67.   IBWRT(ADUD,WRT,4); ERR:=ERR OR GPIBERR('Procedure ADCSYNC');
  68. END; {PROCEDURE ADCSYNCH}
  69.  
  70. {********* ADOVERFLOW(ADUD:INTEGER; VAR ABORT:BOOLEAN):BOOLEAN *************}
  71. FUNCTION ADOVERFLOW;
  72.   {Returns true if missed data or voltage out of range.  ABORT is
  73.    set true if any other a/d board error is detected.}
  74. VAR  RD : BYTE;
  75. BEGIN
  76.   IBRSP(ADUD,RD);              {serial poll of status byte}
  77.   ADOVERFLOW:=(RD AND 10)<>0;         {bit 1 or 3 set}
  78.   ABORT:=ABORT OR ((RD AND 5)<>0);    {bit 0 or 2 set}
  79. END; {FUNCTION ADOVERFLOW}
  80.  
  81. {******* ADCREAD(ADUD,CH:INTEGER; VAR ERR,OVERFLOW:BOOLEAN):REAL ***********}
  82. FUNCTION ADCREAD;
  83.   {Reads channel CH of SR245 A/D board.  ERR should be initialized
  84.    externally.  OVERFLOW flags out of range or missed data.}
  85. VAR
  86.   ANS           : INTEGER;               {A/D value}
  87.   WRT           : ARRAY[1..7] OF CHAR;   {write string for a/d}
  88.   RD            : ARRAY[1..2] OF BYTE;   {read string for a/d}
  89. BEGIN
  90.   WRT[1]:='S'; WRT[2]:='S'; WRT[3]:=CHR(CH+48); WRT[4]:=':'; WRT[5]:='1';
  91.   WRT[6]:=CHR($0D); WRT[7]:=CHR($0A);
  92.   IBWRT(ADUD,WRT,7);  ERR:=ERR OR GPIBERR('Function ADCREAD');
  93.   IBRD(ADUD,RD,2);    ERR:=ERR OR GPIBERR('Function ADCREAD');
  94.   OVERFLOW:=ADOVERFLOW(ADUD,ERR);
  95.   ANS:=(RD[1] SHL 8) OR RD[2];  {convert 2 bytes to integer}
  96.   IF (ANS AND $1000)<>0 THEN ANS:=-(ANS-$1000); {get correct sign}
  97.   ADCREAD:=0.0025*ANS;
  98. END; {FUNCTION ADCREAD}
  99.  
  100. END.